#pragma once

#include <iostream>
#include <pthread.h>
#include "Mutex.hpp"

namespace CondModule
{
    // 使用 LockModule 命名空间中的内容（假设 Mutex 类定义在该命名空间中）
    using namespace LockModule;

    // 条件变量类封装，用于线程间的同步操作
    class Cond
    {
    public:
        // 构造函数：初始化条件变量
        Cond()
        {
            // 调用 pthread_cond_init 初始化条件变量 _cond
            // 第二个参数为 nullptr，表示使用默认属性
            int n = ::pthread_cond_init(&_cond, nullptr);
            (void)n; // 避免未使用的变量警告（假设 n 不需要检查）
        }

        // 等待函数：让当前线程等待条件变量，并释放传入的互斥锁
        void Wait(Mutex &lock) 
        {
            // 调用 pthread_cond_wait，线程会释放 lock 的锁并进入等待状态
            // 当条件变量被唤醒时，线程会重新获取锁并继续执行
            int n = ::pthread_cond_wait(&_cond, lock.LockPtr());
            (void)n; // 避免未使用的变量警告
        }

        // 唤醒一个等待的线程
        void Notify()
        {
            // 调用 pthread_cond_signal 唤醒一个等待该条件变量的线程
            int n = ::pthread_cond_signal(&_cond);
            (void)n; // 避免未使用的变量警告
        }

        // 唤醒所有等待的线程
        void NotifyAll()
        {
            // 调用 pthread_cond_broadcast 唤醒所有等待该条件变量的线程
            int n = ::pthread_cond_broadcast(&_cond);
            (void)n; // 避免未使用的变量警告
        }

        // 析构函数：销毁条件变量
        ~Cond()
        {
            // 调用 pthread_cond_destroy 销毁条件变量 _cond
            int n = ::pthread_cond_destroy(&_cond);
            (void)n; // 避免未使用的变量警告
        }

    private:
        pthread_cond_t _cond; // 条件变量的实际存储对象
    };
}